home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
escalant
/
escala21.lha
/
escalante2.1
/
src
/
editor
/
EscalanteView.h
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-15
|
16KB
|
863 lines
//
// Copyright (C) 1993 Jeff McWhirter
//
#ifndef EscalanteView_First
#define EscalanteView_First
#include "EscalanteGlobal.h"
#include "View.h"
#include "ObjList.h"
#include "Stack.h"
#include "Dialog.h"
#include "Set.h"
#include "Buttons.h"
#include "VGraphElement.h"
#include "VRelation.h"
#include "VEntity.h"
#include "ObjectGrid.h"
#ifdef USE_STRUCTURAL
#include "SGraphElement.h"
#include "SRelation.h"
#include "SEntity.h"
#endif
#include "Geometry.h"
class TextField;
class VObject;
enum ErrorReturn {
eAbort,
eContinue,
eAbortButSaveElements};
#define ADDSV(sclass,vclass,vg)\
ve = new vclass();se = new sclass();\
ve->IfFalseDontWriteOutOriginal(FALSE); \
se->IfFalseDontWriteOutOriginal(FALSE);\
se->AddVGelt(ve);ve->SetSGelt(se);\
se->Init();ve->Init();\
if(vg->GetSGelt())\
vg->GetSGelt()->AddPrototype(se);\
vg->AddPrototype(ve);
#define ADDV(vclass,vg)\
ve = new vclass();\
ve->IfFalseDontWriteOutOriginal(FALSE);\
ve->Init();\
vg->AddPrototype(ve);
#define ADDSVTOLIST(sclass,vclass,list)\
ve = new vclass();se = new sclass();\
ve->IfFalseDontWriteOutOriginal(FALSE);\
se->IfFalseDontWriteOutOriginal(FALSE);\
se->AddVGelt(ve); ve->SetSGelt(se);\
se->Init();ve->Init();\
list.Add(ve);
#define ADDVTOLIST(vclass,list)\
ve = new vclass();\
ve->IfFalseDontWriteOutOriginal(FALSE);\
ve->Init();\
list.Add(ve);
#define NEWELT(sclass, sname,vclass,vname){\
sname = new sclass ();\
vname = new vclass();\
sname->AddVGelt(vname);\
vname->SetSGelt(sname);\
sname->Init(); vname->Init();\
}
#define NEWENT(vclass,vname,sname){\
sname = new SEntity ();\
vname = new vclass();\
sname->AddVGelt(vname);\
vname->SetSGelt(sname);\
sname->Init(); vname->Init();\
}
#define NEWREL(vclass,vname,sname){\
sname= new SRelation ();\
vname = new vclass();\
sname->Init(); vname->Init();\
sname->AddVGelt(vname);\
vname->SetSGelt(sname);\
}
#define PALETTE_LEFT 0
#define PALETTE_TOP 1
#define PALETTE_RIGHT 2
#define PALETTE_BOTTOM 3
extern bool gDoKeyCommands;
extern ObjList gExtraPaletteItems;
extern bool gGraphModified;
extern bool gAlwaysAddMultiples;
extern int gGravity;
extern bool gRubberBand;
extern bool gNameInPalette;
extern bool gBitmapInPalette;
extern Point gPaletteItemSize;
extern Point gPaletteGap;
extern Point gViewSize;
extern Point gGridSize;
extern bool gDoBell;
extern bool gTransNewGraph;
extern bool gTransNorth;
extern int gPaletteRows;
extern int gPaletteCols;
extern int gPaletteThreshold;
extern int gPaletteOrientation;
extern bool gMakePalette;
extern class Stack * gViewStack;
extern bool gNoRepeatAdd;
extern bool gPickInEdit;
extern bool gDeleteInEdit;
class Ink;
extern Ink * gViewInk;
const int cIdPalette= 1100;
const int cGridSize= 10;
const int cChangedGraph= 3000;
const int cPaletteChanged=33333;
const int cViewClosed= 33334;
enum Needs {
NEED_NONE = 0,
NEED_ENTITY,
NEED_RELATION,
NEED_TAIL,
NEED_HEAD,
NEED_ELEMENT,
NEED_E1E2,
NEED_POINT,
NEED_JOINT,
NEED_GFX
};
//
//Menu Ids
//
enum MenuIds{
cALLDV = cUSERCMD,
cDVMENU,
cOPTIONSMENU,
cJOINTSMENU,
cGFXMENU,
cPICKMENU,
cESCALANTE_EDITMENU,
cMOVEMENU,
cSCALEMENU,
cRELMENU,
cEVENTDEPMENU,
cTLTOHDMENU,
cHDTOTLMENU,
cTLTORELMENU,
cHDTORELMENU,
cRELTOHDMENU,
cRELTOTLMENU,
cDELMENU,
cALIGNMENU,
cGROUPMENU,
cESCALANTEVIEWMENU,
cZOOMMENU,
cFLAGMENU,
cDELGROUPMENU,
cESCALANTELASTMENUID
};
enum Actions {
FIRST_ESCALANTE_CMD = cUSERCMD+1000,
FLUSH_COMMANDS,
ADD_ENTITY,
ADD_RELATION,
DELETE_ELEMENT,
DELETE_ENTITY,
DELETE_RELATION,
DELETE_GROUP,
DELETE_ALL,
PICK_SINGLE_ELEMENT,
PICK_SINGLE_ENTITY,
PICK_SINGLE_RELATION,
PICK_SINGLE_WITH_TYPE,
PICK_GROUP_ELEMENT,
PICK_GROUP_ENTITY,
PICK_GROUP_RELATION,
PICK_GROUP_WITH_TYPE,
ADD_SINGLE_ELEMENT,
ADD_SINGLE_ENTITY,
ADD_SINGLE_RELATION,
ADD_GROUP_ELEMENT,
ADD_GROUP_ENTITY,
ADD_GROUP_RELATION,
REMOVE_SINGLE_ELEMENT,
CLEARERROR,
SETPROTOTYPE,
ADDPROTOTYPE,
ACCEPTINPUT,
CHECKTLHD,
RUBBERBAND,
CLEARRECT,
CLEARPICKED,
REMOVETAIL,
REMOVEHEAD,
MOVETAIL,
MOVEHEAD,
SETTAIL,
SETHEAD,
GFXTOFRONT,
GFXTOBACK,
STRETCH_GFX,
MOVE_GFX,
BORDER_GFX,
TURNOFF,
TURNOFFGROUP,
TOFRONT,
TOBACK,
MOVE,
QUICKMOVE,
MOVEGROUP,
ALIGNB,
ALIGNT,
ALIGNR,
ALIGNL,
ALIGNCX,
ALIGNCY,
ALIGNBAT,
ALIGNTAT,
ALIGNRAT,
ALIGNLAT,
ALIGNCXAT,
ALIGNCYAT,
SPACEX,
SPACEY,
LAYOUTHOR,
LAYOUTVER,
SCALE,
RESHAPERECT,
RESHAPEPT,
ROTATE,
SHRINK,
SHRINK_X,
SHRINK_Y,
ADD_JOINT,
REMOVE_JOINT,
MOVE_JOINT,
ADD_JOINTF,
REMOVE_JOINTF,
ADD_JOINTL,
REMOVE_JOINTL,
DRAWRECT,
PRINT_POINT,
MEASURE,
GRID,
MULTIPLES,
INCGRID,
DECGRID,
SHWGRID,
REDRAW,
ALLVS,
LCHINT,
MOVEHINT,
SCALEHINT,
DIEHINT,
COPYHINT,
SHOVE,
SUCK,
PUSH,
POP,
ADDVIEW,
REMOVEVIEW,
NEWVIEWNEWELT,
NEWVIEWOLDELT,
COPYVGRAPH,
COPYNEWVGRAPH,
EXITVIEW,
INSERTVIEW,
WRITE_TEXT_TO_FILE,
READ_TEXT_FROM_FILE,
ABOUTVIEW,
ABOUTMISC,
ABOUTELT,
ABOUTCURRENTMODE,
ABOUTMODE,
eEventDepBase,
eTlToHdBase = eEventDepBase,
eTlToRelBase = eEventDepBase +50,
eHdToTlBase = eEventDepBase +100,
eHdToRelBase = eEventDepBase +150,
eRelToTlBase = eEventDepBase +200,
eRelToHdBase = eEventDepBase +250,
eEventDepLast = eEventDepBase+300,
ACTION_NONE,
ESCALANTEVIEWLASTACTION = ACTION_NONE +1000
};
enum PaletteActions{
SETTOOL = ESCALANTEVIEWLASTACTION+1
};
#define BaseEscalanteView_BASE View
enum BaseEscalanteViewFlags{eBaseEscalanteViewDrawingRect = BIT(eViewLast+1),
eEscalanteBaseViewShowGrid = BIT(eViewLast+2),
eSendInput = BIT(eViewLast+3),
ePickingTl = BIT(eViewLast+4),
ePickingHd = BIT(eViewLast+5),
eCheckTlHd = BIT(eViewLast+6),
eAllVs = BIT(eViewLast+7),
eDoGrid = BIT(eViewLast+8),
eAddMultiples = BIT(eViewLast+9),
eBaseEscalanteViewLast = eViewLast+9
};
enum ViewType{
eSimpleView,
eLastViewType};
class BaseEscalanteView: public BaseEscalanteView_BASE {
public:
Rectangle selectionRect;
class Set selectionSet;
VGraphElement* vgraph;
Stack stack;
int id;
Point grid;
Actions action;
Needs need;
Class* neededClass;
Class* neededClass2;
VGraphElement* e1,*e2;
VGraphElement* NeededElt;
TextField* error;
TextField* info;
ElementOkFunc pickfunc;
ElementOkFunc drawfunc;
VGraphElement* currentElt;
ViewType type;
MetaDef(BaseEscalanteView);
BaseEscalanteView(int id,class Document*, Point, VGraphElement*);
~BaseEscalanteView();
virtual VObject* GetView();
virtual void InitView(){}
void FlushCommand();
class ShowText* GetTextDialog(char * mess, char * title);
virtual ObjectGrid* GetGrid(){return (vgraph?vgraph->GetGrid():0);}
virtual char * GetDescription(){return 0;}
virtual char * GetElementDescription(VGraphElement*){return 0;}
virtual char * GetActionDescription(Actions);
virtual void SignalError(char * c);
virtual void ClearError();
virtual void SignalMode(char * c);
virtual void ClearMode();
bool SendInput(){return TestFlag(eSendInput);}
void SendInput(bool b){SetFlag(eSendInput,b);}
bool AllVs(){return TestFlag(eAllVs);}
void AllVs(bool b){SetFlag(eAllVs,b);}
bool CheckTlHd(){return TestFlag(eCheckTlHd);}
void CheckTlHd(bool b){SetFlag(eCheckTlHd,b);}
bool PickingTl(){return TestFlag(ePickingTl);}
void PickingTl(bool b){SetFlag(ePickingTl,b);}
bool PickingHd(){return TestFlag(ePickingHd);}
void PickingHd(bool b){SetFlag(ePickingHd,b);}
virtual bool ElementOk(VGraphElement * e,bool pick);
virtual bool OkToDraw(VGraphElement * e);
virtual bool OkToPick(VGraphElement * e);
virtual ErrorReturn CouldNotFindHead(VRelation*,Set*s=0);
virtual ErrorReturn CouldNotFindTail(VRelation*,Set*s=0);
virtual void DoneAddingElement(VGraphElement*){}
virtual void DoneAddingElements(class Set*){}
virtual void DoneMovingElement(VGraphElement*){}
virtual bool OkToDeleteElement(VGraphElement*){return TRUE;}
virtual ElementOkFunc GetHeadFunc(VRelation*){return 0;}
virtual ElementOkFunc GetTailFunc(VRelation*){return 0;}
void SetDrawFunc(ElementOkFunc f){drawfunc = f; ForceRedraw();}
void SetPickFunc(ElementOkFunc f){pickfunc = f;}
virtual void VGraphDied(VGraphElement * vg);
virtual char * ActionName(Actions action);
void HideGfx(int gfxid, bool state , ObjList * list = 0);
void Draw(Rectangle);
virtual void DrawGraph(Rectangle r);
virtual Command* Interested(int cmd,int part=0, void * data=0);
virtual bool SetAction(Actions m,void * data =0){return SetAction2(m,data);}
virtual bool SetAction2(Actions m,void * data =0);
virtual void ExitView();
virtual bool PopGraph();
virtual void NewGraph(VGraphElement *, bool push = FALSE);
virtual void GetNewGraph(VGraphElement * vg,VGraphElement * & newvg){ newvg = vg;}
void Zoom(float f);
Rectangle GetVRect();
//The following 4 methods allow one to define what kind of object is needed and of what type.
virtual void SetNeed(Needs n,class Class * neededClass ,class Class * neededClass2 ,ElementOkFunc f );
virtual void SetNeed(Needs n){SetNeed(n,(Class*)0,(Class*)0,0);}
virtual void SetNeed(Needs n,class Class * cl){ SetNeed(n,cl,(Class*)0,0);}
virtual void SetNeed(Needs n,class Class * cl,Class* cl2){SetNeed(n,cl,cl2,0);}
virtual void SetNeed(Needs n,ElementOkFunc f){SetNeed(n,(Class*)0,(Class*)0,f);}
void RectDrawn(bool f){
if(f != RectDrawn()){
SetFlag(eBaseEscalanteViewDrawingRect,f);
InvalidateRect(selectionRect);
if(f) selectionRect = gRect0;
}
}
bool RectDrawn(){return TestFlag(eBaseEscalanteViewDrawingRect);}
virtual void DoneDrawingRect();
void SetSelectionRect(Rectangle);
void DoObserve(int id, int part, void *d , Object *op);
Command *DoMenuCommand(int cmd);
Command *DoLeftButtonDownCommand(Point p, Token t, int i);
Command *DoMiddleButtonDownCommand(Point p, Token t, int i);
bool ShowGrid(){return TestFlag(eEscalanteBaseViewShowGrid);}
void ShowGrid(bool b){SetFlag(eEscalanteBaseViewShowGrid,b);}
bool DoGrid(){return TestFlag(eDoGrid);}
void DoGrid(bool b){SetFlag(eDoGrid,b);}
bool Multiples(){return TestFlag(eAddMultiples);}
void Multiples(bool b){SetFlag(eAddMultiples,b);}
virtual bool AddMultiples(VGraphElement *){return Multiples();}
void ClearPickGroup();
void SetPickGroup(class Class * c =0);
void AddToPickGroup(class Class * c =0);
void SetPickGroup(VGraphElement *);
void AddToPickGroup(VGraphElement *);
virtual void HighlightElement(VGraphElement * vg,bool on = TRUE);
void AlignElementsAt(Set * s, Actions action,Point);
void SpaceElements(Set *, Actions );
};
enum EscalanteViewFlags{eEscalanteViewMakePalette = BIT(eBaseEscalanteViewLast+1),
eEscalanteViewLast = eBaseEscalanteViewLast+1};
#define EscalanteView_BASE BaseEscalanteView
class EscalanteView: public EscalanteView_BASE {
public:
bool sendingInput;
VGraphElement * cvproto;
Gfx * cgfx;
VObject * focus;
class CollectionView *paletteView;
ObjList *tools;
ObjList *allprotos;
VObject *paletteWrapper;
public:
MetaDef(EscalanteView);
EscalanteView(int id,class Document*, Point, VGraphElement*,bool makePalette = TRUE);
~EscalanteView();
void InitView();
bool OkToPick(VGraphElement * e);
virtual bool NewHeadOk(VRelation* nr,VGraphElement *e);
virtual bool NewTailOk(VRelation* nr,VGraphElement *e);
void NewGraph( VGraphElement *, bool push = FALSE);
void AddPrototype(VGraphElement * vg);
void DoObserve(int id, int part, void *d , Object *op);
char * GetActionDescription(Actions);
virtual int GetOrientation();
virtual int GetRows();
virtual int GetCols();
virtual char * GetTextToWrite(VGraphElement*){return 0;}
virtual void HereIsSomeText(char *,VGraphElement*){}
//
//How big are the palette items
//
virtual Point GetPaletteItemSize();
//
//Overrides the ETRC MakeSeparatePalette when it (the ETRC flag ) is FALSE
//
virtual bool MakeSeparatePalette(){return FALSE;}
//
//Overrides the ETRC MakeExtraPalette when it (the ETRC flag ) is TRUE
//
virtual bool DoNotMakeExtraPalette(){return FALSE;}
//
//Overrides the ETRC MakeObserverView when it (the ETRC flag ) is TRUE
//
virtual bool DoNotMakeObserverView(){return FALSE;}
//
//Overrides the ETRC MakePalette when it (the ETRC flag ) is set to false
//
virtual bool ForceMakePalette(){return FALSE;}
//
//You can also set a bit in this view to determine whether to make the palette
//
bool MakePalette(){return TestFlag(eEscalanteViewMakePalette);}
void MakePalette(bool b){SetFlag(eEscalanteViewMakePalette,b);}
virtual ObjList * GetProtoList();
bool SetAction(Actions m,void * data =0);
bool SetAction2(Actions m,void * data =0);
char * ActionName(Actions action);
void ClearPicked();
virtual class VObject * GetView();
class CollectionView * GetPalette();
virtual void MakeToolList();
virtual void AddToToolList(ObjList *l){}
virtual VObject * GetTopVObj();
virtual VObject * GetMiddleVObj();
virtual VObject * GetBottomVObj();
Command* SatisfyNeeds(Point tp,VGraphElement * & cvelt ,VEntity * & cve ,VRelation *& cvr);
Command* SatisfyNeeds(Point tp,VGraphElement * & cvelt ,VEntity * & cve ,VRelation *& cvr,Gfx * & gfx );
void Draw(Rectangle);
void SetTool(VGraphElement*);
void ClearTool();
Command* Interested(int cmd,int part=0, void * data=0);
Command *DoMiddleButtonDownCommand(Point p, Token t, int i);
Command *DoLeftButtonDownCommand(Point, Token, int);
Command *DoKeyCommand(int, Token);
static Menu* MakeMenu(int );
void DoSetupMenu(class Menu*);
void Control(int id, int part, void *val);
Command *DispatchEvents(Point lp, Token &t, Clipper *vf) ;
GrCursor GetCursor(Point);
};
#define ObserverView_BASE EscalanteView
class ObserverView: public ObserverView_BASE {
public:
EscalanteView * theView;
MetaDef(ObserverView);
ObserverView(EscalanteView* v,int id,class Document* doc, Point pt, VGraphElement*vg,bool makePalette):ObserverView_BASE(id,doc,pt,vg,makePalette){
theView = v; theView->AddObserver(this);
}
void DoObserve(int id, int part, void *d , Object *op);
VObject * GetTopVObj(){return 0;}
VObject * GetBottomVObj(){return 0;}
};
#define ScaledObserverView_BASE ObserverView
class ScaledObserverView: public ScaledObserverView_BASE {
public:
float zoomFactor;
MetaDef(ScaledObserverView);
ScaledObserverView(EscalanteView* v,
int id,
class Document* doc,
Point pt,
VGraphElement*vg,
bool makePalette):
ScaledObserverView_BASE(v,id,doc,pt,vg,makePalette){
zoomFactor = 0.5;
}
void DoObserve(int id, int part, void *d , Object *op);
void InitObserver(float f = 0.5);
void Resize();
void Draw(Rectangle);
};
class PaletteButton:public VObjectButton{
public:
MetaDef(PaletteButton)
PaletteButton(int id,VObject*vop,int st = 0):VObjectButton(id,vop,st){}
void DrawInner(Rectangle r, bool highlight);
void SetOrigin(Point);
};
class PaletteItem: public VObject {
public:
Point size;
VGraphElement * elt;
char * str;
Bitmap * bm;
MetaDef(PaletteItem);
PaletteItem(VGraphElement * e,Point p = gPoint16);
PaletteItem(char * s,Point p = gPoint16);
PaletteItem(Bitmap * bm,Point p = gPoint16);
void Init(VGraphElement * e,Point p = gPoint16);
void Draw(Rectangle r);
Metric GetMinSize();
};
class ShowText: public Manager{
public:
MetaDef(ShowText);
class CheapText * textobj;
char * text;
ShowText(char * t=0,char * title = 0);
VObject* DoMakeContent();
MenuBar * DoMakeMenuBar(){return 0;}
void Control(int id, int part, void *val);
};
//
//You can use the EscalanteDialog class as a basis to create
//your own dialog box class. Overwrite the appropriate methods.
//To show a dialog box do a dialog->ShowUnderMouse();
//
#include "Dialog.h"
class EscalanteDialog : public Dialog {
public:
VGraphElement * elt;
MetaDef(EscalanteDialog);
EscalanteDialog(VGraphElement * e=0,char *title= "Dialog");
//
//You can overwrite this method if you don't want the "OK" and "Cancel" buttons
//
VObject *DoMakeContent();
//
//Overwrite this method to give the guts of the dialog
//
virtual VObject * GetInner(){return 0;}
//
//This is what gets called when something happens in the dialog
//e.g. OK button pressed
//
void Control(int id, int, void *v);
//
//By default this method gets called from the Control method when the OK or
//cancel button gets called. The arg is either cIdOk or cIdCancel.
//
virtual void Done(int ){}
};
class TextFieldDialog: public EscalanteDialog{
public:
TextField * text;
TextFieldDialog(char * init = 0);
~TextFieldDialog();
VObject * GetInner ();
char * GetText();
};
#endif